package algorithm

// 胡牌方式：自摸,放冲,枪杠胡,杠上开花,天胡,地胡等
// 胡牌牌型：平胡,碰碰胡,小七对,清一色，13不靠，财神归位等
// 牌墙只剩4张牌的情况下，如果有人放炮，放炮家要负责其他两家的分值
// 放炮胡时闲家的付出为放炮家的一半
// 牌型番值叠加最高不超过番
const (
	WILDCARD byte   = 255  // 万能牌(财神牌)
	BAI      byte   = 0x53 // 白板
	TOTAL    uint32 = 136  //一副麻将的总数
	FENG     byte   = 4    //风牌类型
	ZI       byte   = 5    //字牌类型
	HAND     uint32 = 13   //手牌数量

	// 吃、碰、杠、胡掩码,用无符号32位每个二进制位代表不同的操作状态
	PENG      int64 = 2 << 0 // 碰
	MING_KONG int64 = 2 << 1 // 明杠
	AN_KONG   int64 = 2 << 2 // 暗杠
	BU_KONG   int64 = 2 << 3 // 补杠
	KONG      int64 = 2 << 4 // 杠(代表广义的杠)
	CHOW      int64 = 2 << 5 // 吃
	HU        int64 = 2 << 6 // 鸡胡(也代表广义的胡)

	HU_BAO_TOU1       int64 = 2 << 7  // 爆头（敲响，摸到普通牌）,已经有十二张牌顺刻组合，剩下一张牌为财神，并无将牌，抓到任意一张则为敲响。普通牌2倍，
	HU_BAO_TOU2       int64 = 2 << 8  // 爆头（敲响，摸到摸到白板）,已经有十二张牌顺刻组合，剩下一张牌为财神，并无将牌，抓到任意一张则为敲响。摸到白板4倍
	HU_BAO_TOU3       int64 = 2 << 9  // 爆头（敲响，摸到财神）,已经有十二张牌顺刻组合，剩下一张牌为财神，并无将牌，抓到任意一张则为敲响。摸到财神6倍
	HU_LUAN_FENG      int64 = 2 << 11 // 乱风，手牌都由风字牌组成，无需胡牌牌型
	HU_QING_FENG      int64 = 2 << 30 // 清风，手牌都由风字牌组成，需胡牌牌型
	HU_QUAN_QIU_REN   int64 = 2 << 13 // 全求人(单吊)
	ZIMO              int64 = 2 << 17 // 自摸
	PAOHU             int64 = 2 << 18 // 炮胡,也叫放充
	QIANG_GANG        int64 = 2 << 19 // 抢杠,其他家胡你补杠那张牌
	HU_KONG_FLOWER    int64 = 2 << 20 // 杠上开花,杠完牌抓到的第一张牌自摸了
	HU_HAI_LAO        int64 = 2 << 21 // 海底捞月，每杠一次牌要从牌墙中除去8张牌，所以有杠牌的情况没有海底捞
	TIAN_HU           int64 = 2 << 23 // 天胡
	DI_HU             int64 = 2 << 24 // 地胡
	HU_SINGLE         int64 = 2 << 25 // 13不靠(风未齐)
	HU_SINGLE_ZI      int64 = 2 << 26 // 13不靠
	HU_CAI_1          int64 = 2 << 27 // 一财一刻,1个财神加2个白板组成一副刻子,2倍
	HU_CAI_2          int64 = 2 << 28 // 两财一刻,2个财神加1个白板组成一副刻子,4倍
	HU_CAI_3          int64 = 2 << 29 // 三财一刻,3个财神组成一副刻子,6倍
	HU_GUI_WEI1       int64 = 2 << 14 // 一个财神归位,1个财神扮演其本身牌,2倍
	HU_GUI_WEI2       int64 = 2 << 15 // 两个财神归位,2个财神扮演其本身牌,4倍
	HU_GUI_WEI3       int64 = 2 << 16 // 三个财神归位,3个财神扮演其本身牌,6倍
	HU_3_CAI_SHEN     int64 = 2 << 22 // 三个财神额外加1倍
	HU_SEVEN_PAIR     int64 = 2 << 31 // 小七对(无财神)
	HU_SEVEN_PAIR_CAI int64 = 2 << 32 // 小七对(有财神)
	HU_ONE_SUIT       int64 = 2 << 33 // 清一色(无财神)
	HU_ONE_SUIT_CAI   int64 = 2 << 34 // 清一色(有财神)
	HU_PENG_PENG      int64 = 2 << 35 // 碰碰胡(无财神)
	HU_PENG_PENG_CAI  int64 = 2 << 36 // 碰碰胡(有财神)
)

var Fan = map[int64]uint32{
	HU:                1, // 平胡
	HU_BAO_TOU1:       2, // 爆头（敲响，摸到普通牌）
	HU_BAO_TOU2:       4, // 爆头（敲响，摸到摸到白板）
	HU_BAO_TOU3:       6, // 爆头（敲响，摸到财神）
	HU_PENG_PENG:      4, // 碰碰胡(无财神)
	HU_PENG_PENG_CAI:  2, // 碰碰胡(有财神)
	HU_SEVEN_PAIR:     4, //  小七对(无财神)
	HU_SEVEN_PAIR_CAI: 2, // 小七对(有财神)
	HU_LUAN_FENG:      6, // 乱风，手牌都由风字牌组成，无需胡牌牌型
	HU_QING_FENG:      6, // 清风，手牌都由风字牌组成，需胡牌牌型
	HU_CAI_1:          2, // 一财一刻,1个财神加2个白板组成一副刻子,2倍
	HU_CAI_2:          4, //  两财一刻,2个财神加1个白板组成一副刻子,4倍
	HU_CAI_3:          6, // 三财一刻,3个财神组成一副刻子,6倍
	HU_GUI_WEI1:       2, // 一个财神归位,1个财神扮演其本身牌,2倍
	HU_GUI_WEI2:       4, // 两个财神归位,2个财神扮演其本身牌,4倍
	HU_GUI_WEI3:       6, // 三个财神归位,3个财神扮演其本身牌,6倍
	HU_3_CAI_SHEN:     2, // 三个财神额外加1倍
	TIAN_HU:           2, // 天胡
	DI_HU:             2, // 地胡
	HU_SINGLE:         1, // 13不靠(风未齐)
	HU_SINGLE_ZI:      2, // 13不靠
	HU_QUAN_QIU_REN:   4, // 全求人(单吊)
	HU_ONE_SUIT:       4, // 清一色(无财神)
	HU_ONE_SUIT_CAI:   2, // 清一色(有财神)
	QIANG_GANG:        2, // 抢杠,其他家胡你补杠那张牌
	HU_KONG_FLOWER:    2, // 杠上开花,杠完牌抓到的第一张牌自摸了
	HU_HAI_LAO:        2, // 海底捞月，每杠一次牌要从牌墙中除去8张牌，所以有杠牌的情况没有海底捞
}
